class websocketUtil {
	constructor(url, time, userId) {
		this.is_open_socket = false; // 避免重复连接
		this.url = this.buildUrl(url, userId); // 构建完整 WebSocket URL
		this.timeout = time || 10000; // 心跳间隔（默认 10 秒）
		this.heartbeatInterval = null; // 心跳检测定时器
		this.reconnectTimeOut = null; // 重连定时器

		try {
			this.connectSocketInit(); // 初始化连接
		} catch (e) {
			console.error("连接失败，尝试重连...", e);
			this.reconnect();
		}
	}

	// 构建完整的 WebSocket URL
	buildUrl(baseUrl, userId) {
		if (!baseUrl.endsWith("/")) {
			baseUrl += "/";
		}
		return `${baseUrl}${userId}`;
	}

	// 初始化 WebSocket 连接
	connectSocketInit() {
		if (this.is_open_socket) {
			console.warn("WebSocket 已经连接，无需重复初始化");
			return;
		}

		try {
			this.socketTask = uni.connectSocket({
				url: this.url,
				success: () => {
					console.log(`尝试连接 WebSocket: ${this.url}`);
				},
				fail: (err) => {
					console.error("WebSocket 连接失败:", err);
					this.reconnect();
				},
			});

			// WebSocket 打开事件
			this.socketTask.onOpen(() => {
				console.log("WebSocket 连接成功！");
				this.is_open_socket = true;
				clearTimeout(this.reconnectTimeOut); // 清除重连定时器
				this.startHeartbeat(); // 启动心跳检测
			});

			// WebSocket 关闭事件
			this.socketTask.onClose(() => {
				console.warn("WebSocket 已关闭");
				this.is_open_socket = false;
				this.reconnect(); // 尝试重连
			});

			// WebSocket 错误事件
			this.socketTask.onError((error) => {
				console.error("WebSocket 发生错误:", error);
				this.is_open_socket = false;
				this.reconnect();
			});
		} catch (error) {
			console.error("WebSocket 初始化错误:", error);
			this.reconnect();
		}
	}

	// 发送消息（只有调用时才发送消息）
send(data) {
    if (this.is_open_socket) {
        try {
            // 确保传入的数据为 JSON 格式的字符串
            const message = typeof data === "string" ? data : JSON.stringify(data);

            // 通过 WebSocket 发送消息
            this.socketTask.send({
                data: message,
                success: () => {
                    console.log("消息发送成功:", message);
                },
                fail: (err) => {
                    console.error("消息发送失败:", err);
                },
            });
        } catch (error) {
            console.error("消息发送异常:", error);
        }
    } else {
        console.warn("WebSocket 未连接，无法发送消息");
    }
}




	// 开启心跳检测（自动启动）
	startHeartbeat() {
		if (this.heartbeatInterval) {
			console.warn("心跳检测已在运行，无需重复启动");
			return;
		}

		this.heartbeatInterval = setInterval(() => {
			if (this.is_open_socket) {
				const heartbeatData = {
					value: "心跳包",
					method: "ping"
				};
				console.log("发送心跳包：", heartbeatData);
				this.send(heartbeatData, "heartbeat");
			} else {
				console.warn("连接已断开，停止心跳检测");
				clearInterval(this.heartbeatInterval);
				this.heartbeatInterval = null;
			}
		}, this.timeout);
	}

	// 停止心跳检测
	stopHeartbeat() {
		if (this.heartbeatInterval) {
			clearInterval(this.heartbeatInterval);
			this.heartbeatInterval = null;
			console.log("心跳检测已停止");
		}
	}

	// 重连逻辑
	reconnect() {
		if (this.is_open_socket || this.reconnectTimeOut) {
			return; // 避免重复重连
		}

		console.log("尝试重连 WebSocket...");
		this.reconnectTimeOut = setTimeout(() => {
			this.connectSocketInit();
			this.reconnectTimeOut = null;
		}, 5000); // 5 秒后尝试重连
	}

	// 获取消息
	getMessage(callback) {
		if (!this.socketTask) {
			console.warn("WebSocket 未初始化，无法获取消息");
			return;
		}

		this.socketTask.onMessage((res) => {
			console.log("收到消息：", res.data);
			if (typeof callback === "function") {
				callback(res);
			}
		});
	}

	// 手动关闭 WebSocket
	close() {
		if (this.socketTask && this.socketTask.close) {
			this.socketTask.close({
				success: () => {
					console.log("WebSocket 已手动关闭");
				},
				fail: (err) => {
					console.error("关闭 WebSocket 失败:", err);
				}
			});
			this.stopHeartbeat();
			clearTimeout(this.reconnectTimeOut);
			this.is_open_socket = false;
		} else {
			console.warn("WebSocket 尚未初始化，无法关闭连接");
		}
	}

}

module.exports = websocketUtil;